iT邦幫忙

2021 iThome 鐵人賽

DAY 12
0
Modern Web

30 天我與 Vue 的那些二三事系列 第 12

Day 12 - 動態組件(Dynamic Components)

  • 分享至 

  • xImage
  •  

動態元件(Dynamic-Components)是指Vue可以根據傳入參數的,來去切換不同的元件。

如下範例,根據點擊「home」、「posts」或「archieve」,Component會依照 :is 來代入的值來動態決定載入哪一個元件。
https://codesandbox.io/s/cocky-noyce-chv89?file=/src/App.vue

<template>
  <div id="app">
    <ul class="nav">
      <li>
        <a href="#" @click.prevent="changeView('home')">home</a>
      </li>
      <li>
        <a href="#" @click.prevent="changeView('posts')">posts</a>
      </li>
      <li>
        <a href="#" @click.prevent="changeView('archive')">archieve</a>
      </li>
    </ul>
    <component :is="view"></component>
  </div>
</template>

<script>
const home = {
  // options
  template: `
   <p>This is home.<p>
  `,
};
const posts = {
  // options
  template: `
   <p>This is posts.<p>
  `,
};

const archive = {
  // options
  template: `
   <p>This is archive.<p>
  `,
};

export default {
  name: "App",
  components: {
    home: home,
    posts: posts,
    archive: archive,
  },
  methods: {
    changeView(viewName) {
      this.view = viewName;
    },
  },
  data() {
    return {
      view: "home",
    };
  },
};
</script>

當我們點選對應的超連結,便會傳入對應的變數,並利用該變數切會對應的元件。

https://ithelp.ithome.com.tw/upload/images/20210927/20128925JD5XbdSePL.png

keep-alive

在動態切換元件過程中,我們可能會希望保存元件的狀態,紀錄元件的狀態,避免重新載入元件,這時候就可以在元件外面包一層keep alive的標籤。

如下範例,第二個元件包了 keep-alive>,因此在切換時不會重新 render 元件,而保留了使用者輸入的資料。

<template>
  <div id="app">
    <ul class="nav">
      <li>
        <a href="#" @click.prevent="changeView('home')">home</a>
      </li>
      <li>
        <a href="#" @click.prevent="changeView('posts')">posts</a>
      </li>
      <li>
        <a href="#" @click.prevent="changeView('archive')">archieve</a>
      </li>
    </ul>
    <keep-alive>
      <component :is="view"></component>
    </keep-alive>
  </div>
</template>

https://ithelp.ithome.com.tw/upload/images/20210927/20128925lul2uUofii.png

在home tab輸入文字在inputbox再切換別的超連結後再切回home,文字仍然存在在inputbox中,但如果沒有加上keep-alive,便會發現home的inputbox被清空了,這是因為元件被重新載入囉!


Hi, I am Grant.

個人部落格 - https://grantliblog.wordpress.com/
個人網站 - https://grantli-website.netlify.app/#/mainpage
我的寫作專題 - https://vocus.cc/user/5af2e9b5fd89780001822db4#


上一篇
Day 11 - 自訂事件
下一篇
Day 13 - 非同步元件
系列文
30 天我與 Vue 的那些二三事30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言